
<template>
  <div :id="ztreeId" class="ztree" />
</template>
<script>
import $ from 'jquery'
if (!window.jQuery) {
  window.jQuery = $
}

require('./lib/jquery.ztree.all')

export default {
  name: 'VueMagicTree',
  props: {
    setting: {
      type: Object,
      require: false,
      default: function() {
        return {}
      }
    },
    nodes: {
      type: Array,
      require: true,
      default: function() {
        return []
      }
    }
  },
  data() {
    return {
      ztreeId: 'ztree_' + parseInt(Math.random() * 1e10),
      ztreeObj: null,
      list: [],
      ztreeSetting: {
        view: {
          showIcon: false // default to hide icon
        },
        callback: {
          onAsyncError: (...arg) => {
            this.$emit('onAsyncError', ...arg)
          },
          onAsyncSuccess: (...arg) => {
            this.$emit('onAsyncSuccess', ...arg)
          },
          onCheck: (...arg) => {
            this.$emit('onCheck', ...arg)
          },
          onClick: (...arg) => {
            this.$emit('onClick', ...arg)
          },
          onCollapse: (...arg) => {
            this.$emit('onCollapse', ...arg)
          },
          onDblClick: (...arg) => {
            this.$emit('onDblClick', ...arg)
          },
          onDrag: (...arg) => {
            this.$emit('onDrag', ...arg)
          },
          onDragMove: (...arg) => {
            this.$emit('onDragMove', ...arg)
          },
          onDrop: (...arg) => {
            this.$emit('onDrop', ...arg)
          },
          onExpand: (...arg) => {
            this.$emit('onExpand', ...arg)
          },
          onMouseDown: (...arg) => {
            this.$emit('onMouseDown', ...arg)
          },
          onMouseUp: (...arg) => {
            this.$emit('onMouseUp', ...arg)
          },
          onRemove: (...arg) => {
            this.$emit('onRemove', ...arg)
          },
          onRename: (...arg) => {
            this.$emit('onRename', ...arg)
          },
          onRightClick: (...arg) => {
            this.$emit('onRightClick', ...arg)
          }
        }
      }
    }
  },
  watch: {
    nodes: {
      handler: function(val) {

        this.list = JSON.parse(JSON.stringify( val));

        // update tree
        if (this.ztreeObj) {
          this.ztreeObj.destroy()
        }
        this.$nextTick(() => {
          this.ztreeObj = $.fn.zTree.init(
            $('#' + this.ztreeId),
            Object.assign({}, this.ztreeSetting, this.setting),
            this.list
          )
          this.$emit('onCreated', this.ztreeObj)
        })
      },
      deep: true,
      immediate: true
    }
  },
  methods: {
    loadData(treeData){
        this.list = JSON.parse(JSON.stringify( treeData));

        // update tree
        if (this.ztreeObj) {
          this.ztreeObj.destroy()
        }
        this.$nextTick(() => {
          this.ztreeObj = $.fn.zTree.init(
            $('#' + this.ztreeId),
            Object.assign({}, this.ztreeSetting, this.setting),
            this.list
          )
          this.$emit('onCreated', this.ztreeObj)
        })
    },
    addHoverdom(treenode, domstr, overwrite) {
      const nodedom = $('#' + treenode.tId)
      if ($('#adddom_' + treenode.tId).length > 0) {
        return
      }
      const s = ["<div id='adddom_", treenode.tId, "'>", domstr, '</div>'].join('')
      nodedom.append(s)
    },
    reAsyncChildNodesPromise(_parentNode,_reloadType,_isSilent){
      let reloadType=_reloadType?_reloadType:"refresh",isSilent=_isSilent?_isSilent:true;
      this.ztreeObj.reAsyncChildNodesPromise(_parentNode,reloadType,isSilent);
    }
  }
}
</script>
<style lang="scss" scoped>
/* beauty ztree! */
// .ztree {
//   text-align: left;
//   font-size: 14px;

// li {
//   list-style-type: none;
//   white-space: nowrap;
//   outline: none;
// }
// li ul {
//   position: relative;
//   padding: 0 0 0 20px;
//   margin: 0;
// }
// .line:before {
//   position: absolute;
//   top: 0;
//   left: 10px;
//   height: 100%;
//   content: "";
//   border-right: 1px dotted #dbdbdb;
// }
// .roots_docu:before,
// .roots_docu:after,
// .center_docu:before,
// .bottom_docu:before,
// .center_docu:after,
// .bottom_docu:after {
//   position: absolute;
//   content: "";
//   border: 0 dotted #dbdbdb;
// }
// .roots_docu:before {
//   left: 10px;
//   height: 50%;
//   top: 50%;
//   border-left-width: 1px;
// }
// .roots_docu:after {
//   top: 50%;
//   left: 11px;
//   width: 50%;
//   border-top-width: 1px;
// }
// .center_docu:before {
//   left: 10px;
//   height: 100%;
//   border-left-width: 1px;
// }
// .center_docu:after {
//   top: 50%;
//   left: 11px;
//   width: 50%;
//   border-top-width: 1px;
// }
// .bottom_docu:before {
//   left: 10px;
//   height: 50%;
//   border-left-width: 1px;
// }
// .bottom_docu:after {
//   top: 50%;
//   left: 11px;
//   width: 50%;
//   border-top-width: 1px;
// }
// li a {
//   display: inline-block;
//   line-height: 24px;
//   height: 24px;
//   margin: 0;
//   cursor: pointer;
//   transition: none;
//   vertical-align: middle;
//   color: #555555;
// }
// li a.curSelectedNode{ color: #fff;}
// .node_name {
//   display: inline-block;
//   padding: 0 3px;
//   border-radius: 4px;
// }
// // .curSelectedNode .node_name {
// //   color: #000;
// //   background-color: #c9e9f7;
// // }
// .curSelectedNode_Edit {
//   height: 20px;
//   opacity: 0.8;
//   color: #000;
//   border: 1px #6cc2e8 solid;
//   background-color: #9dd6f0;
// }
// .tmpTargetNode_inner {
//   opacity: 0.8;
//   color: #fff;
//   background-color: #4fcbf0;
//   filter: alpha(opacity=80);
// }
// .rename {
//   font-size: 14px;
//   line-height: 24px;
//   width: 80px;
//   height: 24px;
//   margin: 0;
//   padding: 0;
//   vertical-align: top;
//   border: 0;
//   background: none;
// }
// .button {
//   position: relative;
//   display: inline-block;
//   line-height: 24px;
//   height: 24px;
//   width: 24px;
//   cursor: pointer;
//   text-align: center;
//   vertical-align: middle;
// }

// .button.edit {
//   color: #25ae88;
// }
// .button.remove {
//   color: #cb4042;
// }
// .button.chk {
//   position: relative;
//   width: 16px;
//   height: 16px;
//   margin: 0 4px 0 0;
//   border: 1px solid #d7dde4;
//   border-radius: 2px;
//   background: #fff;
// }
// .chk.radio_true_full,
// .chk.radio_false_full,
// .chk.radio_true_full_focus,
// .chk.radio_false_full_focus,
// .chk.radio_false_disable,
// .chk.radio_true_disable,
// .chk.radio_true_part,
// .chk.radio_false_part,
// .chk.radio_true_part_focus,
// .chk.radio_false_part_focus {
//   border-radius: 8px;
// }
// .button.chk:after {
//   position: absolute;
//   top: 1px;
//   left: 4px;
//   width: 4px;
//   height: 8px;
//   content: "";
//   transition: -webkit-transform 0.2s ease-in-out;
//   transition: transform 0.2s ease-in-out;
//   transition: transform 0.2s ease-in-out, -webkit-transform 0.2s ease-in-out;
//   -webkit-transform: rotate(0deg) scale(0);
//   transform: rotate(0deg) scale(0);
//   border-right: 2px solid #fff;
//   border-bottom: 2px solid #fff;
// }
// .button.checkbox_false_full_focus {
//   border-color: #ccc;
// }
// .button.checkbox_true_full,
// .button.checkbox_true_full_focus,
// .button.checkbox_true_part,
// .button.checkbox_true_part_focus,
// .button.checkbox_true_disable {
//   border-color: #39f;
//   background-color: #39f;
// }
// .button.checkbox_true_full:after,
// .button.checkbox_true_full_focus:after,
// .button.checkbox_true_disable:after {
//   -webkit-transform: rotate(45deg) scale(1);
//   transform: rotate(45deg) scale(1);
// }
// .button.checkbox_true_part:after,
// .button.checkbox_true_part_focus:after {
//   top: 5px;
//   left: 1px;
//   width: 10px;
//   height: 1px;
//   -webkit-transform: rotate(0deg) scale(1);
//   transform: rotate(0deg) scale(1);
//   border-right: 0;
// }
// .button.radio_true_full,
// .chk.radio_true_full_focus,
// .chk.radio_true_part,
// .chk.radio_true_part_focus {
//   border-color: #39f;
// }
// .button.radio_true_full:after,
// .chk.radio_true_full_focus:after,
// .chk.radio_true_part:after,
// .chk.radio_true_part_focus:after {
//   top: 3px;
//   left: 3px;
//   width: 8px;
//   -webkit-transform: rotate(0deg) scale(1);
//   transform: rotate(0deg) scale(1);
//   border: 0;
//   border-radius: 4px;
//   background: #39f;
// }
// .button.checkbox_true_disable,
// .button.checkbox_false_disable,
// .chk.radio_false_disable,
// .chk.radio_true_disable {
//   cursor: not-allowed;
// }
// .button.checkbox_false_disable {
//   background-color: #f3f3f3;
// }
// .button.noline_close:before,
// .button.noline_open:before,
// .button.root_open:before,
// .button.root_close:before,
// .button.roots_open:before,
// .button.roots_close:before,
// .button.bottom_open:before,
// .button.bottom_close:before,
// .button.center_open:before,
// .button.center_close:before {
//   position: absolute;
//   top: 5px;
//   left: 5px;
//   content: "";
//   transition: -webkit-transform ease 0.3s;
//   transition: transform ease 0.3s;
//   transition: transform ease 0.3s, -webkit-transform ease 0.3s;
//   -webkit-transform: rotateZ(0deg);
//   transform: rotateZ(0deg);
//   -webkit-transform-origin: 25% 50%;
//   transform-origin: 25% 50%;
//   border: 6px solid;
//   border-color: transparent transparent transparent #666;
// }
// .button.noline_open:before,
// .button.root_open:before,
// .button.roots_open:before,
// .button.bottom_open:before,
// .button.center_open:before {
//   -webkit-transform: rotateZ(90deg);
//   transform: rotateZ(90deg);
// }
// .button.ico_loading {
//   margin-right: 2px;
//   background: url("")
//     0 center no-repeat;
// }
// .tmpTargetzTree {
//   opacity: 0.8;
//   background-color: #2ea9df;
//   filter: alpha(opacity=80);
// }
// .tmpzTreeMove_arrow {
//   position: absolute;
//   width: 18px;
//   height: 18px;
//   color: #4fcbf0;
// }
// .ztree.zTreeDragUL {
//   overflow: hidden;
//   position: absolute;
//   width: auto;
//   height: auto;
//   margin: 0;
//   padding: 0;
//   opacity: 0.8;
//   border: 1px #176b53 dotted;
//   background-color: #dbdbdb;
//   filter: alpha(opacity=80);
// }
// }
// .zTreeMask {
//   position: absolute;
//   z-index: 10000;
//   opacity: 0;
//   background-color: #cfcfcf;
//   filter: alpha(opacity=0);
// }
</style>
